package com.bestcem.xm.user.dao;

import com.bestcem.xm.user.entity.pojo.ListUserGroupParamDO;
import com.bestcem.xm.user.entity.pojo.SearchDO;
import com.bestcem.xm.user.entity.pojo.SearchGroupsDO;
import com.bestcem.xm.user.entity.pojo.UserGroupDO;
import com.bestcem.xm.user.grpc.service.param.OrgStatusPageParam;
import com.bestcem.xm.user.grpc.service.param.PageParam;
import com.bestcem.xm.user.grpc.service.param.SortParam;
import com.bestcem.xm.user.service.dto.group.GroupBaseDTO;
import com.bestcem.xm.user.service.dto.group.GroupNodeDTO;

import javax.validation.constraints.Min;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * 用户组信息dao
 *
 * @author qiongyu.cui <qiongyu.cui@idiaoyan.com>
 * @version v1.0
 * @date 2021/12/29 10:33
 */
public interface UserGroupDao {

    /**
     * 根据用户组id查询用户组信息
     *
     * @param groupId 用户组id
     * @return com.bestcem.xm.user.group.entity.pojo.UserGroupDO
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 10:46
     */
    UserGroupDO getById(String groupId);

    /**
     * 根据相关参数条件查询用户组信息
     *
     * @param userGroupDO 相关参数检索，条件不能都为空
     * @return com.bestcem.xm.user.group.entity.pojo.UserGroupDO
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 15:38
     */
    UserGroupDO findOne(UserGroupDO userGroupDO);

    /**
     * 查询某个组织的根组织信息
     *
     * @param orgId 组织id
     * @return com.bestcem.xm.user.group.entity.pojo.UserGroupDO
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 16:57
     */
    UserGroupDO getRootGroupByOrgId(String orgId);

    /**
     * 更新用户组状态
     *
     * @param groupId     用户组id
     * @param groupStatus 用户组状态
     * @return 更新结果：true：成功、false：失败
     */
    Boolean updateStatusById(String groupId, Integer groupStatus);

    /**
     * 查询groupIdList中在指定层级上的用户组
     *
     * @param levelId
     * @param groupIdList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/20 11:10
     */
    List<UserGroupDO> listByLevelIdAndGroupIds(String levelId, List<String> groupIdList);

    /**
     * 根据指定参数查询用户组列表信息
     *
     * @param userGroupDO 相关参数检索信息
     * @param statuses    用户组状态列表
     * @param pageSize    页大小
     * @param currentPage 第一页
     * @return 用户组列表
     */
    List<UserGroupDO> listPage(UserGroupDO userGroupDO, List<Integer> statuses, int pageSize, int currentPage);

    /**
     * 根据相关条件统计用户组数量
     *
     * @param userGroupDO 相关参数检索信息
     * @param statuses    状态列表
     * @return 用户组数量
     */
    Long count(UserGroupDO userGroupDO, List<Integer> statuses);


    /**
     * 用户组失效
     *
     * @param groupId   用户组id
     * @param version   当前版本号
     * @param userId    操作的用户id
     * @param srcStatus 原状态
     * @param dstStatus 目标状态
     * @return java.lang.Boolean
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 15:10
     */
    Boolean invalidUserGroup(String groupId, Integer version, String userId, Integer srcStatus, Integer dstStatus);

    /**
     * 根据相关条件查询用户组列表
     *
     * @param userGroupDO 参数条件
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/04 11:29
     */
    List<UserGroupDO> listByCondition(UserGroupDO userGroupDO);

    /**
     * 根据相关条件查询用户组列表
     *
     * @param userGroupDO 可选字段
     * @param statusList
     * @param sortList    排序信息
     * @param page        分页信息
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/17 21:00
     */
    List<UserGroupDO> listByConditionAndSort(UserGroupDO userGroupDO, List<Integer> statusList, ArrayList<SortParam> sortList, PageParam page);

    /**
     * 根据相关条件查询用户组列表数量
     *
     * @param userGroupDO 可选字段
     * @param statusList  状态列表
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/17 21:18
     */
    int countByConditionAndSort(UserGroupDO userGroupDO, List<Integer> statusList);

    /**
     * 更新haveChildrenFlag字段
     *
     * @param groupId          用户组id
     * @param haveChildrenFlag 是否有子组织
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/28 10:57
     */
    void updateHaveChildrenFlag(String groupId, int haveChildrenFlag);

    /**
     * 根据用户组id列表查询用户组信息列表
     *
     * @param groupIdsList 用户组id列表
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/25 14:59
     */
    List<UserGroupDO> listByGroupIds(List<String> groupIdsList);

    /**
     * 通过用户组id查询子组织
     *
     * @param id 用户组id
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/25 18:07
     */
    List<UserGroupDO> getChildrenListByGroupId(String id);


    /**
     * 根据group_parent_id查询子组织
     *
     * @param id
     * @param statuses
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/18 17:17
     */
    List<UserGroupDO> listChildrenByGroupIdAndStatus(String id, List<Integer> statuses);

    /**
     * 根据租户id和组织id列表查询组织信息列表
     *
     * @param orgId        租户id
     * @param groupIdsList 组织id列表
     * @return java.util.List<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 13:51
     */
    List<UserGroupDO> getGroupsByOrgIdAndGroupIds(String orgId, List<String> groupIdsList);

    /**
     * 批量插入组织信息
     *
     * @param userGroups 组织信息列表
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/26 16:39
     */
    void insertBatch(List<UserGroupDO> userGroups);

    /**
     * 添加子组织批量新增隐藏节点
     *
     * @param userGroups
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/23 16:47
     */
    void hiddenGroupInsertBatch(List<UserGroupDO> userGroups);

    /**
     * 根据公司id和组织编码列表查询用户组信息列表
     *
     * @param orgId      组织Id
     * @param groupCodes 组织编码
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.group.service.dto.group.UserGroupDTO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/23 19:08
     */
    List<UserGroupDO> getByOrgIdAndGroupCodes(String orgId, Set<String> groupCodes);

    /**
     * 根据user_id获取用户组信息
     *
     * @param userId 用户Id
     * @return List<UserGroupDO> 用户组UserGroupDO列表
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 11:20
     */
    List<UserGroupDO> listGroupByUserId(String userId);


    /**
     * 根据user_id获取用户组信息
     *
     * @param userId 用户Id
     * @return List<UserGroupDO> 用户组UserGroupDO列表
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 11:20
     */
    List<UserGroupDO> listGroupByUserIdAndOrder(String userId);

    /**
     * 按用户和状态搜索用户挂载的节点
     *
     * @param userId 用户id
     * @param status 状态
     * @return list of group
     */
    List<UserGroupDO> listGroupByUserIdAndStatus(String userId, Integer status);

    /**
     * 搜索用户组列表
     *
     * @param paramDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/06 20:59
     */
    List<UserGroupDO> listUserGroup(ListUserGroupParamDO paramDO);

    /**
     * 搜索用户组列表总数
     *
     * @param paramDO
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/06 20:59
     */
    Long listUserGroupCount(ListUserGroupParamDO paramDO);

    /**
     * 获取子组织id列表
     *
     * @param orgId    公司id
     * @param groupIds 组织id
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:57
     */
    List<String> getSubGroupIds(String orgId, String groupIds);

    /**
     * 分页获取子组织组织
     *
     * @param subGroupList 子组织的id列表
     * @param start        分页参数
     * @param size         分页大小
     * @return com.bestcem.xm.user.service.dto.group.PageDTO<com.bestcem.xm.user.service.dto.group.GroupBaseDTO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:34
     */
    List<GroupBaseDTO> getSubGroupByPage(List<String> subGroupList, Integer start, Integer size);

    /**
     * 获取子组织组织总数
     *
     * @param subGroupList
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/11 18:39
     */
    Long getSubGroupCount(List<String> subGroupList);

    /**
     * 获取指定用户组的所有子用户组
     *
     * @param rootGroupId     用户组id
     * @param includeInactive 是否包含失效组织
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/29 14:28
     */
    List<UserGroupDO> getChildrenListByRootGroupId(String rootGroupId, boolean includeInactive);

    /**
     * 根据用户组id获取指定用户组和所有子用户组数量
     *
     * @param groupId         用户组id
     * @param includeInactive 是否包含子组织
     * @return java.lang.Integer
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/15 14:53
     */
    Integer getSelfAndChildrenCountByGroupId(String groupId, boolean includeInactive);

    /**
     * 根据公司id获取公司的用户组列表
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/7 17:06
     */
    List<UserGroupDO> getListByOrgId(OrgStatusPageParam param);

    /**
     * 根据公司id获取公司的用户组数量
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/22 19:59
     */
    Integer userGroupCountByOrgId(OrgStatusPageParam param);


    /**
     * 根据父组织id获取公司的用户组列表
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/7 17:06
     */
    List<UserGroupDO> getListByParentGroupId(OrgStatusPageParam param);

    /**
     * 根据父组织id获取公司的用户组数量
     *
     * @param param 租户id、父组织id、分页、排序、状态
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/22 19:59
     */
    int userGroupCountByParentGroupId(OrgStatusPageParam param);

    /**
     * 根据用户组id列表获取指定层级上的子用户组数量
     *
     * @param groupLevelId 层级id
     * @param groupIdsList 组织id列表
     * @return long
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/07 10:06
     */
    long countSubRelate(String groupLevelId, List<String> groupIdsList);

    /**
     * 根据用户组id列表分页获取指定层级上的子用户列表
     *
     * @param groupLevelId 层级id
     * @param groupIdsList 组织id列表
     * @param pageSize     每页大小
     * @param currentPage  第几页
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/07 10:07
     */
    List<UserGroupDO> listPageSubRelate(String groupLevelId, List<String> groupIdsList, @Min(1) int pageSize, @Min(1) int currentPage);

    /**
     * 通过组织id和版本号更新组织
     *
     * @param versionId 版本号
     * @param dtoToDo   用户组织
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    int updateByIdAndVersion(Integer versionId, UserGroupDO dtoToDo);

    /**
     * 通过组织id和版本号更新组织(考虑null的情况)
     *
     * @param versionId
     * @param dtoToDo
     * @return int
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/8/9 15:38
     */
    int updateByIdAndVersionWithNull(Integer versionId, UserGroupDO dtoToDo);

    /**
     * 通过组织id和版本号更新组织(带groupParentIds)
     *
     * @param versionId 历史版本号
     * @param dtoToDo   更新参数
     * @return
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/2/7 15:30
     */
    int updateByIdAndVersionWithParentIds(Integer versionId, UserGroupDO dtoToDo);


    /**
     * 批量更新
     *
     * @param dtoToDo
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/25 09:44
     */
    int batchUpdateById(List<UserGroupDO> dtoToDo);

    /**
     * 查询指定父组织下一层的状态为【有效，隐藏的数量】
     *
     * @param parentGroupId 父组织id
     * @param orgId         租户id
     * @param statuses      状态列表
     * @param parentIds     组织列表，查询条件
     * @param currentIds
     * @return long 数量
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 15:16
     */
    long countChild(String parentGroupId, String orgId, List<Integer> statuses, Set<String> parentIds, Set<String> currentIds);

    /**
     * 查询指定父组织下一层的状态为【有效，隐藏的列表】
     *
     * @param parentGroupId 父组织id
     * @param orgId         租户id
     * @param statuses      状态列表
     * @param parentIds     组织列表，查询条件
     * @param currentIds
     * @param size          每页大小
     * @param page          当前页
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 15:25
     */
    List<UserGroupDO> listChild(String parentGroupId, String orgId, List<Integer> statuses, Set<String> parentIds, Set<String> currentIds, Integer size, Integer page);

    /**
     * 新增用户组（可选参数）
     *
     * @param userGroup 用户组信息可选参数
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/8 18:30
     */
    String insertSelective(UserGroupDO userGroup);


    /**
     * 根据层级id查询组织
     *
     * @param ids 层级id集合
     * @return java.util.List<java.lang.String>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 17:52
     */
    List<String> listByLevelIds(List<String> ids);

    /**
     * 根据用户组名称和层级Id
     *
     * @param groupName    组织名称
     * @param groupParentId
     * @param groupLevelId 层级id
     * @param orgId        租户id
     * @param statusList   状态列表
     * @return long
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 15:11
     */
    long getByNameAndLevelId(String groupName, String groupParentId, String groupLevelId, String orgId, ArrayList<Integer> statusList);

    /**
     * 设置组织负责人
     *
     * @param userGroupDO 可选参数
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/10 17:47
     */
    int setAdminId(UserGroupDO userGroupDO);

    /**
     * 根据组织id查询所有父组织列表信息
     *
     * @param groupParentIds 父组织Id列表
     * @return java.util.List<com.bestcem.xm.user.group.service.do.UserGroupDO>
     * @author yanjishuo <jishuo.yan@idiaoyan.cn>
     * @date 2022/01/24 15:50
     */
    List<UserGroupDO> getByGroupIds(List<String> groupParentIds);

    /**
     * 统计指定状态下的用户组数
     *
     * @param searchDO
     * @param parentLevelIds
     * @param parentIds
     * @param currentIds
     * @author jishuo.yan <jishuo.yan@idiaoyan.com>
     * @date 2022/02/08 20:38
     */
    long countSearch(SearchDO searchDO, List<String> parentLevelIds, Set<String> parentIds, Set<String> currentIds);

    /**
     * 查询指定状态下的用户组列表
     * @param searchDO
     * @param levelIds
     * @param parentIds
     * @param currentIds
     * @param offset
     * @param size
     * @return
     */
    List<UserGroupDO> listPages(SearchDO searchDO, List<String> levelIds, Set<String> parentIds, Set<String> currentIds, Integer offset, Integer size);

    /**
     * 根据 org_id 获取组织结构
     *
     * @param orgId:  组织id
     * @param offset: 页数
     * @param size:   页大小
     * @param isPage: 是否分页
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/17 14:41
     */
    List<UserGroupDO> listByOrgIdOrPage(String orgId, Integer offset, Integer size, boolean isPage);

    /**
     * 查询指定节点下不在某颗子树下的指定状态的子节点数量
     *
     * @param groupId  组织id
     * @param statuses 状态列表
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/18 16:38
     */
    Integer getOtherChildrenCount(String groupId, List<Integer> statuses);

    /**
     * 删除指定组织下指定状态的子组织的parentIds数组上指定位数上的数据
     *
     * @param groupId 组织id
     * @param status  子组织状态
     * @param seat    要删除的位置
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/18 17:07
     */
    Integer deleteChildrenSeatLocationPids(String groupId, Integer status, int seat);

    /**
     * 更新所有的子节点的parentId为parentIds的最后一个元素
     *
     * @param orgId              租户id
     * @param parentId           父节点id
     * @param lastNotHiddenGroup
     * @return java.lang.Integer
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/21 13:54
     */
    Integer refreshAllChildrenParentId(String orgId, String parentId, String lastNotHiddenGroup);

    /**
     * 通过组织id列表查询组织
     *
     * @param groupIdList      组织id列表
     * @param includeChildFlag 是否包含子组织
     * @param filterStatusFlag 状态过滤
     * @param pageParam        分页参数
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:15
     */
    List<UserGroupDO> listByGroupIdsByUserId(List<String> groupIdList, Boolean includeChildFlag, Boolean filterStatusFlag, PageParam pageParam);

    /**
     * 通过组织id列表查询组织总数
     *
     * @param groupIdList      组织id列表
     * @param includeChildFlag 是否包含子组织
     * @param filterStatusFlag 状态过滤
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/04/02 18:15
     */
    Long listByGroupIdsByUserIdCount(List<String> groupIdList, Boolean includeChildFlag, Boolean filterStatusFlag);

    /**
     * 根据指定用户组id和层级id 分页查询指定层级上的子用户组数量
     *
     * @param groupId      组id
     * @param groupLevelId 层级id
     * @param statusList   状态列表
     * @return long 满足条件的数量
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/24 12:25
     */
    long countChildrenNum(String groupId, String groupLevelId, List<Integer> statusList);

    /**
     * 根据指定用户组id和层级id 分页查询指定层级上的子用户组列表
     *
     * @param groupId      组id
     * @param groupLevelId 层级id
     * @param statusList   状态列表
     * @param pageSize     每页大小
     * @param currentPage  当前页
     * @return java.util.List<com.bestcem.xm.user.group.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/24 12:25
     */
    List<UserGroupDO> listPageChildren(String groupId, String groupLevelId, List<Integer> statusList, int pageSize, int currentPage);

    /**
     * 根据用户组id列表获取指定层级上关联的用户组信息
     *
     * @param relatedIds: 关联的组织id
     * @param page:       当前页
     * @param size:       页大小
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/24 18:43
     */
    List<GroupBaseDTO> listRelateGroups(List<String> relatedIds, Integer page, Integer size);

    /**
     * 根据用户组id列表获取指定层级上关联的用户组信息
     *
     * @param relatedIds: 关联的组织id
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/24 18:43
     */
    Integer listRelateGroupsCount(List<String> relatedIds);


    /**
     * 获取子组织
     *
     * @param parentId:        父组织id
     * @param includeInactive: 是否排除
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/2/24 18:43
     */
    List<GroupNodeDTO> getChildrenGroup(String parentId, boolean includeInactive);

    /**
     * 联表查询ds_user_group
     *
     * @param userId 用户id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/4/29 2:56
     */
    List<UserGroupDO> getGroupsByUserIdLeftJoinGroup(String userId);

    /**
     * 根据groupId列表和状态查询值列表信息
     *
     * @param groupIds 组织id列表
     * @param status   状态
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 17:15
     */
    List<UserGroupDO> listByGroupIdsAndStatus(List<String> groupIds, Integer status);

    /**
     * 根据组织code获取组织列表
     *
     * @param orgId          公司id
     * @param groupCodesList 组织编码列表
     * @param statusList     组织状态列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/5/17 15:59
     */
    List<UserGroupDO> listGroupsByCodes(String orgId, List<String> groupCodesList, List<Integer> statusList);

    /**
     * 获取指定组在指定层级上的子组织关联的用户数总和
     *
     * @param userStatus
     * @param groupId
     * @param groupLevelId
     * @param userId
     * @param statuses
     * @return java.lang.Long
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/27 20:14
     */
    Long getSelfAndChildrenUserNum(Integer userStatus, String groupId, String groupLevelId, String userId, Integer... statuses);

    /**
     * 获取当前组织下所有指定状态的子组织id列表
     *
     * @param groupId 组织id
     * @param status  组织状态
     * @return java.util.List<java.lang.String>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/28 16:45
     */
    List<String> getChildrenIdsByStatus(String groupId, Integer status);

    /**
     * 更新组织状态
     *
     * @param validGroupIds 需要更新的组织id列表
     * @param userId        操作的用户id
     * @param destStatus    目标状态
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/28 16:50
     */
    void updateChildrenStatus(List<String> validGroupIds, String userId, Integer destStatus);

    /**
     * 根据组织id列表查询所有的子组织列表信息
     *
     * @param groupParentIds 组织id列表
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 14:30
     */
    List<UserGroupDO> listChildrenByParentIds(List<String> groupParentIds);

    /**
     * 根据groupIds和groupLevelId查询对应的节点信息
     *
     * @param groupIds 组织id列表
     * @param levelId  层级id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 14:39
     */
    List<UserGroupDO> listByGroupIdsAndLevelId(List<String> groupIds, String levelId);


    /**
     * 支持模糊搜索用户组列表
     *
     * @param searchGroupsDO
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 21:08
     */
    List<UserGroupDO> searchGroups(SearchGroupsDO searchGroupsDO);

    /**
     * 支持模糊搜索用户组总数
     *
     * @param searchGroupsDO
     * @return java.lang.Long
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/05 21:09
     */
    Long searchGroupsCount(SearchGroupsDO searchGroupsDO);

    /**
     * 查询seq和orgId
     *
     * @param offset
     * @param size
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/19 22:07
     */
    List<UserGroupDO> getSeqAndOrgId(Integer offset, Integer size);

    /**
     * 更新隐藏节点的组织名称
     *
     * @param orgId
     * @param groupId
     * @param groupName
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/20 20:13
     */
    int updateHiddenGroupName(String orgId, String groupId, String groupName);

    /**
     * 清空某个用户的所有组织关系
     *
     * @param userId
     * @return void
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/20 20:13
     */
    void deleteRelationsOfUser(String userId);


    /**
     * 根据层级id和状态列表查询组织
     *
     * @param levelId
     * @param statusList
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/22 00:29
     */
    List<UserGroupDO> getGroupByLevelIdAndStatusList(String levelId, List<Integer> statusList);

    /**
     * 所有状态为活动和隐藏的子孙组织
     *
     * @param orgId
     * @param groupId
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/24 16:27
     */
    List<UserGroupDO> getAllSubGroup(String orgId, String groupId);

    /**
     * 所有状态为活动和隐藏的子组织
     *
     * @param orgId   公司id
     * @param groupId 父组织id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/07/24 16:28
     */
    List<UserGroupDO> listSubGroupByGroupId(String orgId, String groupId);


    /**
     * 根据org_id和group_status查询所有组织
     *
     * @param orgId    租户ide
     * @param statuses 组织状态
     * @return list of group
     */
    List<UserGroupDO> listByOrgIdAndStatuses(String orgId, Integer... statuses);

    /**
     * 更新组织状态
     *
     * @param groupIdList
     * @return int
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/08/03 15:55
     */
    Integer deleteInvalidGroup(List<String> groupIdList);

    /**
     * 查询组织下的所有子孙组织
     *
     * @param orgId
     * @param groupId
     * @param page
     * @param size
     * @return java.util.List<java.lang.String>
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/19 14:31
     */
    List<String> listChildrenByParentId(String orgId, String groupId, int page, int size);

    /**
     * 统计组织下的所有子孙组织数量
     *
     * @param orgId
     * @param groupId
     * @return java.lang.Long
     * @author zhangfeng <feng.zhang@idiaoyan.com>
     * @date 2022/8/19 18:24
     */
    Long countChildrenByParentId(String orgId, String groupId);
}

